package Leetcode.每日一题;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName 数组中的最大数对和
 * @since: 2023/8/29 10:10
 * @auth: kirito
 * @description:
 * 给你一个下标从 0 开始的整数数组 nums 。请你从 nums 中找出和 最大 的一对数，且这两个数数位上最大的数字相等。
 *
 * 返回最大和，如果不存在满足题意的数字对，返回 -1 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [51,71,17,24,42]
 * 输出：88
 * 解释：
 * i = 1 和 j = 2 ，nums[i] 和 nums[j] 数位上最大的数字相等，且这一对的总和 71 + 17 = 88 。
 * i = 3 和 j = 4 ，nums[i] 和 nums[j] 数位上最大的数字相等，且这一对的总和 24 + 42 = 66 。
 * 可以证明不存在其他数对满足数位上最大的数字相等，所以答案是 88 。
 * 示例 2：
 *
 * 输入：nums = [1,2,3,4]
 * 输出：-1
 * 解释：不存在数对满足数位上最大的数字相等。
 *
 * 最大数位相同。。。
 * 1.转为字符串遍历找出一个数中的最大数位
 * 2.取模取余
 * for (int maxD = num; maxD > 0; maxD /= 10) {
 *                 max = Math.max(max, maxD % 10);
 *             }
 * https://www.bilibili.com/video/BV1wh4y1Q7XW/?vd_source=bb13dc2c93abb249d3580e11536700c1
 **/
public class 数组中的最大数对和 {
    public static int maxSum(int[] nums) {
        int ans = -1; // 存储最大的结果值
        int[] maxVal = new int[10]; // 存储每个数字位上的最大值

        Arrays.fill(maxVal, Integer.MIN_VALUE); // 将maxVal数组初始化为最小值
        for (int num : nums) {
            int max = 0; // 当前数字的最大位数值

            // 计算当前数字的最大位数值
            for (int maxD = num; maxD > 0; maxD /= 10) {
                max = Math.max(max, maxD % 10);
            }

            // 更新最大结果值
            ans = Math.max(ans, num + maxVal[max]);

            // 更新当前数字位数上的最大值
            maxVal[max] = Math.max(maxVal[max], num);
        }

        return ans; // 返回最大结果值
    }

    public static void main(String[] args) {
        int[] nums = {51, 71, 17, 24, 42};
        System.out.println(maxSum(nums));
    }
}
